package xin.pdf;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import org.apache.commons.lang3.StringUtils;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;

/**
 * <pre>
 * 测试
 * </pre>
 *
 * @author 马老七
 * @version 1.0
 * @since 2019/3/27
 */
public class TestPdfHandler implements PDFHandler{

    /**
     *  将pdf文件转为图片，存放在pdf文件当前目录下
     * @param path 文件路径
     * @param source 文件名称
     * @param formatName 图片格式
     * @throws IOException
     */
    public  static void renderToImage(String path, String source, String formatName) throws IOException {
        formatName = StringUtils.isBlank(formatName)?"PNG" :formatName;
        String target = source.substring(0,source.indexOf("."));
        File pdf = new File(path + File.separator + source);
        PDDocument doc = PDDocument.load(pdf);
        PDFRenderer renderer = new PDFRenderer(doc);
        int pageCount = doc.getNumberOfPages();
        for(int i=0;i<pageCount;i++){
            // 第二个参数为dpi分辨率单位
//            BufferedImage image = renderer.renderImageWithDPI(i, 296);
            // 第二个参数为缩放比
            BufferedImage image = renderer.renderImage(i, 1f);
            String img = path + File.separator + target + "_" + (i + 1)  + "."+ formatName;
            ImageIO.write(image, formatName , new File(img));
        }
    }

    /**
     * 添加水印
     * @param source 原文件
     * @param target 添加水印后文件
     * @param text  水印文字
     * @param x 水印位置x
     * @param y 水印位置y
     * @throws Exception
     */
    public static void addPdfTextMark(String source,String target, String text,float x, float y) throws Exception {
        PdfReader reader = new PdfReader(source);
        PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(new File(target)));
        PdfContentByte under;
        int pageSize = reader.getNumberOfPages();// 原pdf文件的总页数
        for(int i = 1; i <= pageSize; i++) {
//            under = stamp.getUnderContent(i);// 水印在之前文本下
            under = stamp.getOverContent(i);//水印在之前文本上
            under.beginText();
            under.setColorFill(BaseColor.GRAY);// 文字水印 颜色
            under.setFontAndSize(PdfFont.MAR_FONT, 38);// 文字水印 字体及字号
            under.setTextMatrix(x, y);// 文字水印 起始位置
            under.showTextAligned(Element.ALIGN_CENTER, text, x, y, 45);
            PdfGState gs = new PdfGState();// 设置水印透明度
            gs.setStrokeOpacity(0.3f);// 设置笔触字体不透明度为0.4f
            under.setGState(gs);
            under.endText();
        }
        stamp.close();// 关闭
    }

    public ByteArrayOutputStream handle(HashMap<String, String> data) {

        /**
         *  Rectangle - 用于设置pdf页面级别的信息如：背景颜色、页面大小（A4，A5等）、边框颜色、边距、横向纵向等
         *
         */
        Rectangle rect = new Rectangle(PageSize.A4);// A4 纵向 横向为:PageSize.A4.rotate()
        rect.setBackgroundColor(BaseColor.WHITE); //页面背景色
        Document document = new Document(rect);
        ByteArrayOutputStream baos = null;
        try {
            baos = new ByteArrayOutputStream();
            PdfWriter writer = PdfWriter.getInstance(document ,baos);
            writer.setPdfVersion(PdfWriter.PDF_VERSION_1_2); //PDF版本(默认1.4)

            /**
             * 设置用户密码, 所有者密码,用户权限,所有者权限
             *  权限参数
             *
             * @see PdfWriter.ALLOW_MODIFY_CONTENTS - 允许打印,编辑，复制，签名 加密级别：40-bit-RC4
             * @see PdfWriter.ALLOW_COPY - 允许复制，签名 不允许打印，编辑 加密级别：40-bit-RC
             * @see PdfWriter.ALLOW_MODIFY_ANNOTATIONS - 允许打印,编辑，复制，签名 加密级别：40-bit-RC4
             * @see PdfWriter.ALLOW_FILL_IN - 允许打印,编辑，复制，签名 加密级别：40-bit-RC4
             * @see PdfWriter.ALLOW_SCREENREADERS - 允许打印,编辑，复制，签名 加密级别：40-bit-RC4
             * @see PdfWriter.ALLOW_ASSEMBLY - 允许打印,编辑，复制，签名 加密级别：40-bit-RC4
             * @see PdfWriter.EMBEDDED_FILES_ONLY - 允许打印,编辑，复制，签名 加密级别：40-bit-RC4
             * @see PdfWriter.DO_NOT_ENCRYPT_METADATA - 允许打印,编辑，复制，签名 加密级别：40-bit-RC4
             * @see PdfWriter.ENCRYPTION_AES_256 - 允许打印,编辑，复制，签名 加密级别：256-bit-AES
             * @see PdfWriter.ENCRYPTION_AES_128 - 允许打印,编辑，复制，签名 加密级别：128-bit-AES
             * @see PdfWriter.STANDARD_ENCRYPTION_128 - 允许打印,编辑，复制，签名 加密级别：128-bit-RC4
             * @see PdfWriter.STANDARD_ENCRYPTION_40 - 允许打印,编辑，复制，签名 加密级别：40-bit-RC4
             */
            //writer.setEncryption("userpassword".getBytes(), "ownerPassword".getBytes(),  PdfWriter.ALLOW_COPY, PdfWriter.ENCRYPTION_AES_128);

            /******** pdf属性信息************/
            document.addAuthor("马老七");//作者
            document.addSubject("iText 测试文件");//主题
            document.addTitle("iText 主题");//标题
            document.addKeywords("iText"); //关键字
            document.addCreator("马老七");//创造程序
            document.addCreationDate();//创建日期
            /******** pdf属性信息************/

            document.open(); //打开文档开始写入数据
            document.newPage();//新建一个页面

            Paragraph p = new Paragraph("我的个人简历\r\n",PdfFont.TITLE_FONT);
            p.setAlignment(Element.ALIGN_CENTER);
            p.setSpacingAfter(20);
            document.add(p);

            /**
             * 新建一个表格 - PdfPTable
             * PdfPTable 本身用很多构造方法，这里使用的是列数的。
             */
            PdfPTable table = new PdfPTable(4);//创建一个4列的表格
            table.setHorizontalAlignment(Element.ALIGN_CENTER);
            table.setWidths(new int[]{20, 30, 20, 30});//设置宽度
            table.setWidthPercentage(100f);// 表格宽度-百分比的
            table.setSpacingAfter(5f);//段后间距
            table.setSpacingBefore(3f);//段前间距

            PdfPCell cell11 = new PdfPCell(new Phrase("姓名",PdfFont.TH_FONT));
            cell11.setHorizontalAlignment(Element.ALIGN_CENTER);//横向居中
            cell11.setVerticalAlignment(Element.ALIGN_MIDDLE);//纵向居中
            cell11.setFixedHeight(30f);//设置固定高度
            cell11.setColspan(1);//合并列
            cell11.setPadding(3f);//padding
            table.addCell(cell11);//将单元格添加到表格中

            PdfPCell cell12 =  new PdfPCell(new Phrase("马老七",PdfFont.CONTEXT_FONT));
            cell12.setHorizontalAlignment(Element.ALIGN_CENTER);
            cell12.setVerticalAlignment(Element.ALIGN_MIDDLE);
            cell12.setColspan(3);
            cell12.setPadding(3f);
            table.addCell(cell12);

            PdfPCell cell21 =  new PdfPCell(new Phrase("性别",PdfFont.TH_FONT));
            cell21.setHorizontalAlignment(Element.ALIGN_CENTER);
            cell21.setVerticalAlignment(Element.ALIGN_MIDDLE);
            cell21.setPadding(3f);
            cell21.setFixedHeight(30f);
            table.addCell(cell21);
            PdfPCell cell22 =  new PdfPCell(new Phrase("男",PdfFont.CONTEXT_FONT));
            cell22.setHorizontalAlignment(Element.ALIGN_CENTER);
            cell22.setVerticalAlignment(Element.ALIGN_MIDDLE);
            cell22.setPadding(3f);
            table.addCell(cell22);

            PdfPCell cell23 =  new PdfPCell(new Phrase("爱好",PdfFont.TH_FONT));
            cell23.setHorizontalAlignment(Element.ALIGN_CENTER);
            cell23.setVerticalAlignment(Element.ALIGN_MIDDLE);

            cell23.setFixedHeight(30f);
            cell23.setPadding(3f);
            table.addCell(cell23);
            PdfPCell cell24 =  new PdfPCell(new Phrase("女",PdfFont.CONTEXT_FONT));
            cell24.setHorizontalAlignment(Element.ALIGN_CENTER);
            cell24.setVerticalAlignment(Element.ALIGN_MIDDLE);
            cell24.setPadding(3f);
            table.addCell(cell24);


            PdfPCell cell31 =  new PdfPCell(new Phrase("年龄",PdfFont.TH_FONT));
            cell31.setHorizontalAlignment(Element.ALIGN_CENTER);
            cell31.setVerticalAlignment(Element.ALIGN_MIDDLE);
            cell31.setFixedHeight(30f);
            cell31.setPadding(3f);
            table.addCell(cell31);
            PdfPCell cell32 =  new PdfPCell(new Phrase("不详",PdfFont.CONTEXT_FONT));
            cell32.setHorizontalAlignment(Element.ALIGN_CENTER);
            cell32.setVerticalAlignment(Element.ALIGN_MIDDLE);
            cell32.setPadding(3f);
            table.addCell(cell32);

            PdfPCell cell33 =  new PdfPCell(new Phrase("婚姻状况",PdfFont.TH_FONT));
            cell33.setHorizontalAlignment(Element.ALIGN_CENTER);
            cell33.setVerticalAlignment(Element.ALIGN_MIDDLE);
            cell33.setFixedHeight(30f);
            cell33.setPadding(3f);
            table.addCell(cell33);
            PdfPCell cell34 =  new PdfPCell(new Phrase("未婚单身狗一枚",PdfFont.CONTEXT_FONT));
            cell34.setHorizontalAlignment(Element.ALIGN_CENTER);
            cell34.setVerticalAlignment(Element.ALIGN_MIDDLE);
            cell34.setPadding(3f);
            table.addCell(cell34);

            PdfPCell cell61 = new PdfPCell(new Phrase("自拍照",PdfFont.TH_FONT));
            cell61.setHorizontalAlignment(Element.ALIGN_CENTER);//横向居中
            cell61.setVerticalAlignment(Element.ALIGN_MIDDLE);//纵向居中
            cell61.setFixedHeight(80f);
            cell61.setPadding(3f);
            cell61.setColspan(1);
            table.addCell(cell61);
            PdfPCell cell62 =  new PdfPCell(Image.getInstance("E:\\test\\pdf\\ldh.png"));
            cell62.setHorizontalAlignment(Element.ALIGN_CENTER);//横向居中
            cell62.setVerticalAlignment(Element.ALIGN_MIDDLE);//纵向居中
            cell62.setPadding(3f);
            cell62.setColspan(3);
            table.addCell(cell62);
            document.add(table);
        } catch(DocumentException de) {
            System.err.println(de.getMessage());
        }finally {
            if(document != null){
                document.close(); // 关闭文档
            }
            return baos;
        }

    }



    public static void main(String[] args) throws Exception {
        TestPdfHandler handler = new TestPdfHandler();
        ByteArrayOutputStream baos = handler.handle(new HashMap<String, String>());
        File pdf = new File("E:\\test\\pdf\\iText.pdf");
        FileOutputStream fos = new FileOutputStream(pdf);
        baos.writeTo(fos);
        baos.close();
        fos.close();
        renderToImage("E:\\test\\pdf","iText.pdf","png");

        addPdfTextMark("E:\\test\\pdf\\iText.pdf","E:\\test\\pdf\\iText_Mark.pdf","www.spuermali.xin",300f,350f);
        renderToImage("E:\\test\\pdf","iText_Mark.pdf","jpg");
    }
}
